Lambdaから起動テンプレートを用いてインスタンスの起動をしてみた
はじめに
こんにちは、アノテーションのなかたです。
今回は、Lambdaから起動テンプレートを用いてインスタンスの起動をしてみました。
今回の構成図はこちらになります。
やってみる
1. Lambda関数の作成
Python3.12でLambda関数を作成します。名前はstartEC2LaunchTemplate
としました。
以下のコードをデプロイします。
import boto3
import os
from botocore.exceptions import ClientError
# AWS EC2クライアントの初期化
ec2_client = boto3.client('ec2')
def lambda_handler(event, context):
# 環境変数から起動テンプレート名を取得
launch_template_name = os.environ.get('LAUNCH_TEMPLATE_NAME')
if not launch_template_name:
error_msg = "起動テンプレート名が環境変数に設定されていません。"
print(error_msg)
return {"statusCode": 400, "body": error_msg}
try:
# 起動テンプレートからインスタンスを起動
response = ec2_client.run_instances(
LaunchTemplate={
'LaunchTemplateName': launch_template_name,
'Version': '$Latest' # 最新バージョンを使用
},
MinCount=1,
MaxCount=1
)
instance_id = response['Instances'][0]['InstanceId']
success_msg = f"インスタンス {instance_id} が起動テンプレート {launch_template_name} から正常に起動されました。"
print(success_msg)
return {"statusCode": 200, "body": success_msg}
except ClientError as e:
error_msg = f"インスタンスの起動中にエラーが発生しました: {str(e)}"
print(error_msg)
return {"statusCode": 500, "body": error_msg}
こちらのスクリプト作成は、Claude 3.5 Sonnetに作成してもらいました。
また、こちらのコードではLambdaの環境変数を利用しています。
起動テンプレートの名前を設定するため、設定タブ > 環境変数 > 編集
より設定します。
次のように設定します。
キー: `LAUNCH_TEMPLATE_NAME`
値: 起動テンプレートの名前
2. LambdaのIAMロールを変更
先ほどのコードを実行するためには、以下の権限が必要になります。
- EC2インスタンスの起動権限
- 起動テンプレートの読み取り権限
- 起動テンプレート内のIAMインスタンスプロフィールを実行する権限
起動テンプレート内で使用されているIAMインスタンスプロフィールに対して、iam:PassRole権限が必要です。
特にこの権限が必要だとは想定しておらず、私は一度エラーを発生させてしまいました。
iam:PassRoleについては、チバユキさんの記事がとてもわかりやすくおすすめです。
発生したエラー
{
"statusCode": 500,
"body": "インスタンスの起動中にエラーが発生しました: An error occurred (UnauthorizedOperation) when calling the RunInstances operation: You are not authorized to perform this operation. User: arn:aws:sts::xxxxxxxxxxx:assumed-role/startEC2LaunchTemplate-role-xxxxxxx/startEC2LaunchTemplate is not authorized to perform: iam:PassRole on resource: arn:aws:iam::xxxxxxxxxxx:role/xxxxxxxxx-ssm-managed-instance-core-role because no identity-based policy allows the iam:PassRole action."
}
ではこれら3つのIAMポリシーをLambdaに許可していきます。
設定タブのアクセス権限から、実行ロールのリンクにアクセスします。
以下のJSONをインラインポリシーとして追加します。ポリシー名は、startEC2LaunchTemplatePolicy
としました。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:CreateTags",
"ec2:RunInstances",
"ec2:DescribeLaunchTemplates",
"ec2:DescribeLaunchTemplateVersions"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "iam:PassRole",
"Resource": [
"arn:aws:iam::AWS アカウント ID:instance-profile/*",
"arn:aws:iam::AWS アカウント ID:role/xxxxxxxxx-ssm-managed-instance-core-role"
]
}
]
}
xxxxxxxxx-ssm-managed-instance-core-role
には、起動テンプレート内で使用しているIAMインスタンスプロフィール名を挿入します。
3. Lambda関数のテスト
では、実行する条件が整ったのでテストを行います。
Response
{
"statusCode": 200,
"body": "インスタンス i-xxxxxxxxx が起動テンプレート SSMManagedInstanceLT から正常に起動されました。"
}
正常に実行が完了しました!
EC2の画面からもインスタンスの起動が確認できています。
おわりに
今回の検証では、権限周りで特に苦労しました。
それぞれのサービスにおいて必要な権限が何であるかを把握しておくと、よりIAMポリシーを作成する際のスピードが早くなり、検証をスムーズに進められると感じました。
また今回の検証目的としては、「スポットインスタンスを起動する起動テンプレートの呼び出し」をしたいという考えがありました。
そのため、次の機会にこちらを検証してみようと思います。
参考
アノテーション株式会社について
アノテーション株式会社はクラスメソッドグループのオペレーション専門特化企業です。サポート・運用・開発保守・情シス・バックオフィスの専門チームが、最新 IT テクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。当社は様々な職種でメンバーを募集しています。「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイトをぜひご覧ください。